1. Field of the Invention
The present invention relates to techniques for rendering graphical images of three-dimensional models. More specifically, the present invention relates to a successive-convolution-compositing technique for rendering soft shadows and/or translucent surfaces.
2. Related Art
Graphical scenes are often rendered using a “layered sprite model.” A layered sprite model provides a scene description in which the objects are represented as “sprites,” which are parallel planar surfaces with an associated depth position. For instance, such sprites can include rectangles aligned with the X, Y axes, with their depth position being a Z coordinate. Each of these planar surfaces may have a diffuse color image (or texture) as well as an “alpha texture,” which determines coverage of each region of the planar surface. Sprites are usually rendered in back-to-front order, with the coverage value being used to blend between the underlying color and the sprite color.
A layered sprite model may be extended to include the illusion of light falling onto them by computing a “shadow texture” for each sprite. This shadow texture has a brightness that represents the amount of light reaching each region of the sprite, taking into account the sprites closer to the light source than the sprite itself. Note that the light source may be a parallel beam of light, called a “directional light,” or a spotlight with a location and a direction-dependent intensity.
The shadow texture for a sprite may be computed in a number of ways. For shadowing sprites that have a coverage texture, it is important to take that coverage texture into account when working out how much light will reach another sprite (which is referred to as the “shadowed sprite”).
A common technique for computing the shadow texture of a shadowed sprite proceeds as follows. First, the shadow texture for the shadowed sprite is set to 1.0 everywhere. Each shadowing sprite that is closer to the light source than the shadowed sprite is then transformed into the plane of the shadowed sprite using the light geometry. This transformed geometry is then used to “texture map” the coverage map of the shadowing sprite into the shadow map by multiplying the shadow map by 1.0 minus the coverage of the shadowing sprite. The result of this technique is a composite shadow map that may be used to modulate the brightness of the diffuse map on the shadowed sprite. (An alternative implementation considers the cast shadows to be sprites in their own right, performing the compositing in the final frame buffer. After each shadowed sprite is rendered, the shadow sprites are rendered over the top, darkening the contents of the frame-buffer directly.)
It is typical in the state of the art to filter or blur the coverage mask of the shadowing sprite before compositing it into the shadowed sprite's shadow map. This approximates the appearance of an area light source casting light onto the scene. However, this technique is only accurate for a scene with two layers and a single shadowing sprite. For example, if two shadowing sprites at the same depth cast shadows onto a shadowed sprite, in order to be optically accurate, it is necessary to merge both coverage masks together and then blur the result, rather than compositing them independently. In an alternative technique in the state of the art, all of the coverage masks are composited into the shadow map, and the result in blurred. This will only be accurate when all of the shadowing sprites are at the same distance from the shadowed sprite.
This can be seen as necessary by considering two rectangular shadowing sprites that touch along one edge. In order to be physically accurate, no light should pass through that edge onto the shadowed sprite. However, if the coverage of each shadowing sprite is blurred and composited independently, a crack will appear in the shadow along the edge where they touch. This is because convolution is an approximation to the proper optical computation of soft shadows.
A more-accurate approach to computing soft shadows is to consider each point on the shadowed sprite and to compute directly how much light would be occluded by the shadowing sprites. This approach considers a large number of rays starting at different points on the light source and computes the amount of light reaching the shadowed surface. This approach provides an accurate estimate of the illumination (given sufficiently many rays), but can be computationally prohibitive. The averaging of the rays is done after the occlusions have been combined for each ray independently, and the absence of a crack is correctly determined by the fact that rays will hit the geometry for each shadowing sprite.
In contrast to this computationally-intensive technique, the previously-described technique that convolves the coverage mask of the shadowing sprite before compositing it is only an approximation. However, many user interfaces and graphic designs use just two layers, so this convolution-based technique is widely used.
Hence, what is needed is a method and an apparatus that provides a computationally-efficient technique for computing the soft shadows that result from multiple shadowing sprites (at equal or unequal depths).